﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TCC_Hotel.Entidades;
using System.Data.SqlClient;
using System.Configuration;
using TCC_Hotel.Entidades.Basicas;

namespace TCC_Hotel.Repositorio
{
    public class HospedeRepositorio
    {
        ControleBancoDados controle = new ControleBancoDados();


        /// <summary>
        /// Insere um novo hóspede particular nos bancos de dados
        /// </summary>
        /// <param name="hospede">Entidade Hospede particular</param>
        /// <returns>true se inseriu ou false se não</returns>
        public bool CadastrarHospedeParticular(HospedeParticular hospede)
        {
           
            //definição do comando sql
            string sql =
                "INSERT INTO Hospede_Particular VALUES ('" +
                hospede.Nome + "', '" +
                hospede.Nascimento.Date + "', '" +
                hospede.Contato.Telefone[0] + "', '" +
                hospede.Contato.Telefone[1] + "', '" +
                hospede.Contato.Celular[0] + "', '" +
                hospede.Contato.Celular[1] + "', '" +
                hospede.Contato.Email + "', '" +
                hospede.Endereco.Logradouro + "', " +
                hospede.Endereco.Numero + ", '" +
                hospede.Endereco.Bairro + "', '" +
                hospede.Endereco.CEP + "', '" +
                hospede.Endereco.Complemento + "', '" +
                hospede.Endereco.Cidade + "', '" +
                hospede.Endereco.Estado.nome + "', '" +
                hospede.Endereco.Estado.sigla + "', '" +
                hospede.RG + "', '" +
                hospede.CPF + "')";

            //Método que escreve o comando sql nos bancos de dados
            return controle.EscreveBancoDados(sql);
        }

        /// <summary>
        /// Insere um novo hóspede faturado nos bancos de dados
        /// </summary>
        /// <param name="hospede">Entidade Hospede faturado</param>
        /// <returns>true se inseriu ou false se não</returns>
        public bool CadastrarHospedeFaturado(HospedeFaturado hospede)
        {
           
            //definição do comando sql
            string sql =
                "INSERT INTO Hospede_Faturado VALUES ('" +
                hospede.Nome + "', '" +
                hospede.Nascimento.Date + "', '" +
                hospede.Contato.Telefone[0] + "', '" +
                hospede.Contato.Telefone[1] + "', '" +
                hospede.Contato.Celular[0] + "', '" +
                hospede.Contato.Celular[1] + "', '" +
                hospede.Contato.Email + "', '" +
                hospede.Endereco.Logradouro + "', " +
                hospede.Endereco.Numero + ", '" +
                hospede.Endereco.Bairro + "', '" +
                hospede.Endereco.CEP + "', '" +
                hospede.Endereco.Complemento + "', '" +
                hospede.Endereco.Cidade + "', '" +
                hospede.Endereco.Estado.nome + "', '" +
                hospede.Endereco.Estado.sigla + "', '" +
                hospede.RG + "', '" +
                hospede.CPF + "', '" +
                hospede.CNPJ + "', '" +
                hospede.CargoEmpresa + "')";


            //Método que escreve o comando sql nos bancos de dados
            return controle.EscreveBancoDados(sql);
        }

        /// <summary>
        /// Recupera no banco todos os hospedes faturados cadastrados
        /// </summary>
        /// <returns>Lista com todos os hospedes faturados</returns>
        public List<HospedeFaturado> RecuperarHospedesFaturados()
        {
            List<HospedeFaturado> listaResposta = new List<HospedeFaturado>();
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoServidor"].ConnectionString);
            SqlDataReader reader;
            //definição do comando sql
            string sql =
                "SELECT * FROM Hospede_Faturado";

            //Cria uma objeto do tipo comando passando como parametro a string sql e a string de conexão
            SqlCommand comando = new SqlCommand(sql, con);

            //--------tenta conectar no servidor externo-----------------------
            try
            {

                //abre a conexao
                con.Open();

                //Verifica se tem algum comando nao executado no servidor principal
                controle.verificaConsistencia();
                controle.verificaConsistenciaLocal();


                //executa a query
                reader = comando.ExecuteReader();

                //le os dados retornados e monta objeto hóspedes
                listaResposta = ListarHospedesFaturados(reader);

                //fecha a conexao
                con.Close();


            }

     //--------Ocorreu excessao, conectar no servidor local-------------------------
            catch (SqlException e)
            {


                //erro referente a servidor inacessivel ou timeout ocorreu
                if (e.Number == 53 || e.Number == -2)
                {
                    //configura para apontar no servidor local
                    SqlConnection con2 = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoLocal"].ConnectionString);
                    comando.Connection = con2;

                    //abre conexao
                    con2.Open();

                    //executa a query
                    reader = comando.ExecuteReader();
                    
                    //le os dados retornados e monta objeto hóspedes
                    listaResposta = ListarHospedesFaturados(reader);

                    //fecha a conexao
                    con2.Close();

                }
            }
            finally
            {
                con.Close();
            }

            return listaResposta;


        }

        /// <summary>
        /// Recupera no banco todos os hospedes particulares cadastrados
        /// </summary>
        /// <returns>Lista com todos os hospedes particulares</returns>
        public List<HospedeParticular> RecuperarHospedesParticulares()
        {
            List<HospedeParticular> listaResposta = new List<HospedeParticular>();
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoServidor"].ConnectionString);
            SqlDataReader reader;
            //definição do comando sql
            string sql =
                "SELECT * FROM Hospede_Particular";

            //Cria uma objeto do tipo comando passando como parametro a string sql e a string de conexão
            SqlCommand comando = new SqlCommand(sql, con);

            //--------tenta conectar no servidor externo-----------------------
            try
            {

                //abre a conexao
                con.Open();

                //Verifica se tem algum comando nao executado no servidor principal
                controle.verificaConsistencia();
                controle.verificaConsistenciaLocal();


                //executa a query
                reader = comando.ExecuteReader();

                //le os dados retornados e monta objeto hóspedes
                listaResposta = ListarHospedesParticulares(reader);

                //fecha a conexao
                con.Close();


            }

     //--------Ocorreu excessao, conectar no servidor local-------------------------
            catch (SqlException e)
            {


                //erro referente a servidor inacessivel ou timeout ocorreu
                if (e.Number == 53 || e.Number == -2)
                {
                    //configura para apontar no servidor local
                    SqlConnection con2 = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoLocal"].ConnectionString);
                    comando.Connection = con2;

                    //abre conexao
                    con2.Open();

                    //executa a query
                    reader = comando.ExecuteReader();
                    //le os dados retornados e monta objeto hóspedes
                    listaResposta = ListarHospedesParticulares(reader);

                    //fecha a conexao
                    con2.Close();

                }
            }
            finally
            {
                con.Close();
            }

            return listaResposta;


        }

        /// <summary>
        /// Recupera no banco um hospede faturado cadastrado
        /// </summary>
        /// <returns>hospedes faturado </returns>
        public HospedeFaturado RecuperarDetalhesHospedeFaturado(string CPF)
        {
            HospedeFaturado resposta = new HospedeFaturado();
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoServidor"].ConnectionString);
            SqlDataReader reader;
            //definição do comando sql
            string sql =
                "SELECT * FROM Hospede_Faturado WHERE CPF = '" + CPF + "'";

            //Cria uma objeto do tipo comando passando como parametro a string sql e a string de conexão
            SqlCommand comando = new SqlCommand(sql, con);

            //--------tenta conectar no servidor externo-----------------------
            try
            {

                //abre a conexao
                con.Open();

                //Verifica se tem algum comando nao executado no servidor principal
                controle.verificaConsistencia();
                controle.verificaConsistenciaLocal();


                //executa a query
                reader = comando.ExecuteReader();

                //le os dados retornados e monta objeto hóspedes
                resposta = ListarHospedesFaturados(reader).FirstOrDefault();

                //fecha a conexao
                con.Close();


            }

     //--------Ocorreu excessao, conectar no servidor local-------------------------
            catch (SqlException e)
            {


                //erro referente a servidor inacessivel ou timeout ocorreu
                if (e.Number == 53 || e.Number == -2)
                {
                    //configura para apontar no servidor local
                    SqlConnection con2 = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoLocal"].ConnectionString);
                    comando.Connection = con2;

                    //abre conexao
                    con2.Open();

                    //executa a query
                    reader = comando.ExecuteReader();

                    //le os dados retornados e monta objeto hóspedes
                    resposta = ListarHospedesFaturados(reader).FirstOrDefault();

                    //fecha a conexao
                    con2.Close();

                }
            }
            finally
            {
                con.Close();
            }

            return resposta;


        }

        /// <summary>
        /// Recupera no banco um hospede faturado cadastrado
        /// </summary>
        /// <returns>hospedes faturado </returns>
        public HospedeFaturado RecuperarDetalhesHospedeFaturadoPorRG(string RG)
        {
            HospedeFaturado resposta = new HospedeFaturado();
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoServidor"].ConnectionString);
            SqlDataReader reader;
            //definição do comando sql
            string sql =
                "SELECT * FROM Hospede_Faturado WHERE RG = '" + RG + "'";

            //Cria uma objeto do tipo comando passando como parametro a string sql e a string de conexão
            SqlCommand comando = new SqlCommand(sql, con);

            //--------tenta conectar no servidor externo-----------------------
            try
            {

                //abre a conexao
                con.Open();

                //Verifica se tem algum comando nao executado no servidor principal
                controle.verificaConsistencia();
                controle.verificaConsistenciaLocal();


                //executa a query
                reader = comando.ExecuteReader();

                //le os dados retornados e monta objeto hóspedes
                resposta = ListarHospedesFaturados(reader).FirstOrDefault();

                //fecha a conexao
                con.Close();


            }

     //--------Ocorreu excessao, conectar no servidor local-------------------------
            catch (SqlException e)
            {


                //erro referente a servidor inacessivel ou timeout ocorreu
                if (e.Number == 53 || e.Number == -2)
                {
                    //configura para apontar no servidor local
                    SqlConnection con2 = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoLocal"].ConnectionString);
                    comando.Connection = con2;

                    //abre conexao
                    con2.Open();

                    //executa a query
                    reader = comando.ExecuteReader();

                    //le os dados retornados e monta objeto hóspedes
                    resposta = ListarHospedesFaturados(reader).FirstOrDefault();

                    //fecha a conexao
                    con2.Close();

                }
            }
            finally
            {
                con.Close();
            }

            return resposta;


        }


        /// <summary>
        /// Recupera no banco um hospede particular cadastrado
        /// </summary>
        /// <returns>hospedes particular </returns>
        public HospedeParticular RecuperarDetalhesHospedeParticular(string CPF)
        {
            HospedeParticular resposta = new HospedeParticular();
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoServidor"].ConnectionString);
            SqlDataReader reader;
            //definição do comando sql
            string sql =
                "SELECT * FROM Hospede_Particular WHERE CPF = '" + CPF + "'";

            //Cria uma objeto do tipo comando passando como parametro a string sql e a string de conexão
            SqlCommand comando = new SqlCommand(sql, con);

            //--------tenta conectar no servidor externo-----------------------
            try
            {

                //abre a conexao
                con.Open();

                //Verifica se tem algum comando nao executado no servidor principal
                controle.verificaConsistencia();
                controle.verificaConsistenciaLocal();


                //executa a query
                reader = comando.ExecuteReader();

                //le os dados retornados e monta objeto hóspedes
                resposta = ListarHospedesParticulares(reader).FirstOrDefault();

                //fecha a conexao
                con.Close();


            }

     //--------Ocorreu excessao, conectar no servidor local-------------------------
            catch (SqlException e)
            {


                //erro referente a servidor inacessivel ou timeout ocorreu
                if (e.Number == 53 || e.Number == -2)
                {
                    //configura para apontar no servidor local
                    SqlConnection con2 = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoLocal"].ConnectionString);
                    comando.Connection = con2;

                    //abre conexao
                    con2.Open();

                    //executa a query
                    reader = comando.ExecuteReader();

                    //le os dados retornados e monta objeto hóspedes
                    resposta = ListarHospedesParticulares(reader).FirstOrDefault();

                    //fecha a conexao
                    con2.Close();

                }
            }
            finally
            {
                con.Close();
            }

            return resposta;

        }

        /// <summary>
        /// Recupera no banco um hospede particular cadastrado
        /// </summary>
        /// <returns>hospedes particular </returns>
        public HospedeParticular RecuperarDetalhesHospedeParticularPorRG(string RG)
        {
            HospedeParticular resposta = new HospedeParticular();
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoServidor"].ConnectionString);
            SqlDataReader reader;
            //definição do comando sql
            string sql =
                "SELECT * FROM Hospede_Particular WHERE RG = '" + RG + "'";

            //Cria uma objeto do tipo comando passando como parametro a string sql e a string de conexão
            SqlCommand comando = new SqlCommand(sql, con);

            //--------tenta conectar no servidor externo-----------------------
            try
            {

                //abre a conexao
                con.Open();

                //Verifica se tem algum comando nao executado no servidor principal
                controle.verificaConsistencia();
                controle.verificaConsistenciaLocal();


                //executa a query
                reader = comando.ExecuteReader();

                //le os dados retornados e monta objeto hóspedes
                resposta = ListarHospedesParticulares(reader).FirstOrDefault();

                //fecha a conexao
                con.Close();


            }

     //--------Ocorreu excessao, conectar no servidor local-------------------------
            catch (SqlException e)
            {


                //erro referente a servidor inacessivel ou timeout ocorreu
                if (e.Number == 53 || e.Number == -2)
                {
                    //configura para apontar no servidor local
                    SqlConnection con2 = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoLocal"].ConnectionString);
                    comando.Connection = con2;

                    //abre conexao
                    con2.Open();

                    //executa a query
                    reader = comando.ExecuteReader();

                    //le os dados retornados e monta objeto hóspedes
                    resposta = ListarHospedesParticulares(reader).FirstOrDefault();

                    //fecha a conexao
                    con2.Close();

                }
            }
            finally
            {
                con.Close();
            }

            return resposta;

        }

        /// <summary>
        /// Edita um hóspede faturado nos bancos de dados
        /// </summary>
        /// <param name="CPF">CPF do hóspede faturado  a ser editado</param>
        /// <param name="hospede">Novas caracteristicas do hóspede faturado </param>
        /// <returns>true se editou ou false se não</returns>
        public bool EditarHospedeFaturado(string CPF, HospedeFaturado hospede)
        {
            
            //definição do comando sql
            string sql =
                "UPDATE Hospede_Faturado SET " +
                "Nome = '" + hospede.Nome + "', " +
                "Nascimento = '" + hospede.Nascimento.Date + "', " +
                "Telefone1 = '" + hospede.Contato.Telefone[0] + "', " +
                "Telefone2 = '" + hospede.Contato.Telefone[1] + "', " +
                "Celular1 = '" + hospede.Contato.Celular[0] + "', " +
                "Celular2 = '" + hospede.Contato.Celular[1] + "', " +
                "Email = '" + hospede.Contato.Email + "', " +
                "Logradouro = '" + hospede.Endereco.Logradouro + "', " +
                "Numero = " + hospede.Endereco.Numero + ", " +
                "Bairro = '" + hospede.Endereco.Bairro + "', " +
                "CEP = '" + hospede.Endereco.CEP + "', " +
                "Complemento = '" + hospede.Endereco.Complemento + "', " +
                "Cidade = '" + hospede.Endereco.Cidade + "', " +
                "Estado = '" + hospede.Endereco.Estado.nome + "', " +
                "UF = '" + hospede.Endereco.Estado.sigla + "', " +
                "RG = '" + hospede.RG + "', " +
                "CPF = '" + hospede.CPF + "', " +
                "CNPJ = '" + hospede.CNPJ + "', " +
                "CARGO = '" + hospede.CargoEmpresa + "' WHERE CPF ='" + CPF + "'";


            //Método que escreve o comando sql nos bancos de dados
            return controle.EscreveBancoDados(sql);


        }

        /// <summary>
        /// Edita um hóspede particular nos bancos de dados
        /// </summary>
        /// <param name="CPF">CPF do hóspede particular  a ser editado</param>
        /// <param name="hospede">Novas caracteristicas do hóspede particular </param>
        /// <returns>true se editou ou false se não</returns>
        public bool EditarHospedeParticular(string CPF, HospedeParticular hospede)
        {
            
            //definição do comando sql
            string sql =
                "UPDATE Hospede_Particular SET " +
                "Nome = '" + hospede.Nome + "', " +
                "Nascimento = '" + hospede.Nascimento.Date + "', " +
                "Telefone1 = '" + hospede.Contato.Telefone[0] + "', " +
                "Telefone2 = '" + hospede.Contato.Telefone[1] + "', " +
                "Celular1 = '" + hospede.Contato.Celular[0] + "', " +
                "Celular2 = '" + hospede.Contato.Celular[1] + "', " +
                "Email = '" + hospede.Contato.Email + "', " +
                "Logradouro = '" + hospede.Endereco.Logradouro + "', " +
                "Numero = " + hospede.Endereco.Numero + ", " +
                "Bairro = '" + hospede.Endereco.Bairro + "', " +
                "CEP = '" + hospede.Endereco.CEP + "', " +
                "Complemento = '" + hospede.Endereco.Complemento + "', " +
                "Cidade = '" + hospede.Endereco.Cidade + "', " +
                "Estado = '" + hospede.Endereco.Estado.nome + "', " +
                "UF = '" + hospede.Endereco.Estado.sigla + "', " +
                "RG = '" + hospede.RG + "', " +
                "CPF = '" + hospede.CPF + "' WHERE CPF ='" + CPF + "'";


            //Método que escreve o comando sql nos bancos de dados
            return controle.EscreveBancoDados(sql);

        }

        /// <summary>
        /// Lê dados da tabela correspondente através de um comando SQL os montando 
        /// a lista que é retornada
        /// </summary>
        /// <param name="reader">SqlDataReader</param>
        /// <returns>Lista de hospede faturado</returns>
        public List<HospedeFaturado> ListarHospedesFaturados(SqlDataReader reader)
        {
            List<HospedeFaturado> listaResposta = new List<HospedeFaturado>();

            //le os dados retornados e monta objeto hóspedes
            while (reader.Read())
            {
                listaResposta.Add(new HospedeFaturado()
                {
                    Nome = Convert.ToString(reader["Nome"]),
                    Nascimento = Convert.ToDateTime(reader["Nascimento"]).Date,
                    Contato = new Contato()
                    {
                        Celular = new List<string>() { Convert.ToString(reader["Celular1"]), Convert.ToString(reader["Celular2"]) },
                        Telefone = new List<string>() { Convert.ToString(reader["Telefone1"]), Convert.ToString(reader["Telefone2"]) },
                        Email = Convert.ToString(reader["Email"])

                    },
                    Endereco = new Endereco()
                    {
                        Logradouro = Convert.ToString(reader["Logradouro"]),
                        Bairro = Convert.ToString(reader["Bairro"]),
                        CEP = Convert.ToString(reader["CEP"]),
                        Cidade = Convert.ToString(reader["Cidade"]),
                        Complemento = Convert.ToString(reader["Complemento"]),
                        Estado = new Estado() { nome = Convert.ToString(reader["Estado"]), sigla = Convert.ToString(reader["UF"]) },
                        Numero = Convert.ToInt32(reader["Numero"])
                    },
                    CPF = Convert.ToString(reader["CPF"]),
                    RG = Convert.ToString(reader["RG"]),
                    CNPJ = Convert.ToString(reader["CNPJ"]),
                    CargoEmpresa = Convert.ToString(reader["Cargo"])


                });

            }

            return listaResposta;


        }

        /// <summary>
        /// Lê dados da tabela correspondente através de um comando SQL os montando
        /// a lista que é retornada
        /// </summary>
        /// <param name="reader">SqlDataReader</param>
        /// <returns>Lista de hospede faturado</returns>
        public List<HospedeParticular> ListarHospedesParticulares(SqlDataReader reader)
        {
            List<HospedeParticular> listaResposta = new List<HospedeParticular>();

            //le os dados retornados e monta objeto hóspedes
            while (reader.Read())
            {
                listaResposta.Add(new HospedeParticular()
                {
                    Nome = Convert.ToString(reader["Nome"]),
                    Nascimento = Convert.ToDateTime(reader["Nascimento"]).Date,
                    Contato = new Contato()
                    {
                        Celular = new List<string>() { Convert.ToString(reader["Celular1"]), Convert.ToString(reader["Celular2"]) },
                        Telefone = new List<string>() { Convert.ToString(reader["Telefone1"]), Convert.ToString(reader["Telefone2"]) },
                        Email = Convert.ToString(reader["Email"])

                    },
                    Endereco = new Endereco()
                    {
                        Logradouro = Convert.ToString(reader["Logradouro"]),
                        Bairro = Convert.ToString(reader["Bairro"]),
                        CEP = Convert.ToString(reader["CEP"]),
                        Cidade = Convert.ToString(reader["Cidade"]),
                        Complemento = Convert.ToString(reader["Complemento"]),
                        Estado = new Estado() { nome = Convert.ToString(reader["Estado"]), sigla = Convert.ToString(reader["UF"]) },
                        Numero = Convert.ToInt32(reader["Numero"])
                    },
                    CPF = Convert.ToString(reader["CPF"]),
                    RG = Convert.ToString(reader["RG"])

                });

            }

            return listaResposta;


        }
    }
}